#include "mainwidget.h"
#include <QHBoxLayout> // 水平布局  VBox 垂直布局
#include <QWidget>
#include "debug.h"
#include "sessionfriendarea.h"

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    // 设置窗口的标题
    this->setWindowTitle("我的聊天室");
    // 设置窗口的图标
    this->setWindowIcon(QIcon(":/resource/image/logo.png"));
    // 设置主窗口的高度
    this->setFixedHeight(400);

    // 初始化主窗口的样式布局
    InitMainWindow();
    // 初始化左侧窗口的样式布局
    InitLeftWindow();
    // 初始化右侧窗口的样式布局
    InitRightWindow();
    // 初始化中间窗口的样式布局
    InitMidWindow();

    // 初始化信号槽
    InitSignalSlot();

}
// 加载会话列表
void MainWidget::loadSesstionList()
{

}

// 加载朋友列表
void MainWidget::loadFriendList()
{

}

// 加载好友申请列表
void MainWidget::loadApplyList()
{

}


// 点击到会话标签页
void MainWidget::switchTabToSession()
{
    // 1.记录当前切换到哪个标签页
    activeTab = SESSION_LIST;
    // 2. 调整图标显示装口，把会话的图标设置为 active,另外两个图标设为inactive
    sessionTable->setIcon(QIcon(":/resource/image/session_active.png"));
    friendTable->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTable->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    // 3.主窗口中间部分，加载出用户的会话列表
    this->loadSesstionList();

}

void MainWidget::switchTabToFriend()
{
    // 1.记录当前切换到哪个标签页
    activeTab = SESSION_LIST;
    // 2. 调整图标显示装口，把会话的图标设置为 active,另外两个图标设为inactive
    sessionTable->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTable->setIcon(QIcon(":/resource/image/friend_active.png"));
    applyTable->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    // 3.主窗口中间部分，加载出用户的会话列表
    this->loadFriendList();

}

void MainWidget::switchTabToApply()
{
    // 1.记录当前切换到哪个标签页
    activeTab = APPLY_LIST;
    // 2. 调整图标显示装口，把会话的图标设置为 active,另外两个图标设为inactive
    sessionTable->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTable->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTable->setIcon(QIcon(":/resource/image/apply_active.png"));
    // 3.主窗口中间部分，加载出用户的会话列表
    this->loadApplyList();

}


void MainWidget:: InitSignalSlot()
{
    ///////////////////////////////////////
    ///连接信号槽，处理上述标签页切换问题
    ///////////////////////////////////////
    connect(sessionTable,&QPushButton::clicked,this,&MainWidget::switchTabToSession);
    connect(friendTable,&QPushButton::clicked,this,&MainWidget::switchTabToFriend);
    connect(applyTable,&QPushButton::clicked,this,&MainWidget::switchTabToApply);
}


void MainWidget:: InitMainWindow()
{
    // 创建 水平布局对象
    // 该对应的作用是，自动管理 左中右窗    口 位置干系
    QHBoxLayout* layout = new QHBoxLayout();
    // 设置layout 内部元素之间的间隔距离，设为0 就是紧挨着
    layout->setSpacing(0);

    //layout 里面元素距离四个边界的距离
    layout->setContentsMargins(0,0,0,0);
    // 将 layout 添加到 mainwidge 内，作为一个主要的布局管理器
    this->setLayout(layout);

    windowLeft = new QWidget();
    windowMid = new QWidget();
    windowRight = new QWidget();

    // 设置 窗口宽度
    windowLeft->setFixedWidth(70);
    windowMid->setFixedWidth(210);
    // 右侧窗口（聊天界面，编辑文本区）的宽度，需要根据主窗口自适应
    // 可以设置一个最小的宽度，最大可以自适应
    windowRight->setMinimumWidth(420);
    // 将该三个窗口添加到布局管理器(layout)内

    // 使用QSS 给窗口设置颜色
    windowLeft->setStyleSheet("QWidget{background-color:rgb(46,46,46);}");
    windowMid->setStyleSheet("QWidget{background-color:rgb(247,247,247);}");
    windowRight->setStyleSheet("QWidget{background-color:rgb(225,225,225);}");

    layout->addWidget(windowLeft);
    layout->addWidget(windowMid);
    layout->addWidget(windowRight);

}


void MainWidget:: InitLeftWindow()
{
    QVBoxLayout* layout = new QVBoxLayout();
    // 设置间距
    layout->setSpacing(20);
    // 左上右下 布局内容与窗口上边界之间会保留 50 像素的空白区域
    layout->setContentsMargins(0,50,0,0);
    windowLeft->setLayout(layout);

    //添加用户头像
    userAvatar = new QPushButton();
    userAvatar->setFixedSize(45,45);
    userAvatar->setIconSize(QSize(30,30));
    userAvatar->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
    // 设置背景颜色为透明
    userAvatar->setStyleSheet("QPushButton {background-color:transparent;}");
    // 设置 图标 靠上对齐，水平居中
    layout->addWidget(userAvatar,1,Qt::AlignTop|Qt::AlignHCenter);

    // 添加会话标签按钮
    sessionTable = new QPushButton();
    // 设置按钮大小
    sessionTable->setFixedSize(45,45);
    sessionTable->setIconSize(QSize(30,30));
    sessionTable->setIcon(QIcon(":/resource/image/session_inactive.png"));
    sessionTable->setStyleSheet("QPushButton {background-color:transparent;}");
    layout->addWidget(sessionTable,1,Qt::AlignTop|Qt::AlignHCenter);

    // 好友标签页按钮
    friendTable = new QPushButton();
    friendTable->setFixedSize(45,45);
    friendTable->setIconSize(QSize(30,30));
    friendTable->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    friendTable->setStyleSheet("QPushButton {background-color:transparent;}");
    layout->addWidget(friendTable,1,Qt::AlignTop|Qt::AlignHCenter);

    // 好友申请标签页
    applyTable = new QPushButton();
    applyTable->setFixedSize(45,45);
    applyTable->setIconSize(QSize(30,30));
    applyTable->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    applyTable->setStyleSheet("QPushButton {background-color:transparent;}");
    layout->addWidget(applyTable,1,Qt::AlignTop|Qt::AlignHCenter);
    // 添加一个可伸缩性的空间，使的4个图标向上对齐
    layout->addStretch(20);


    // 连接信号槽，处理上述标签页切换问题




}


void MainWidget:: InitRightWindow()
{
    // 1. 创建右侧窗口的布局管理器   垂直布局
    QVBoxLayout* vlayout = new QVBoxLayout();
    vlayout->setSpacing(0);
    vlayout->setContentsMargins(0,0,0,0);
    // 对齐方式
    vlayout->setAlignment(Qt::AlignTop);

    // 将布局管理器放到Wiget中
    windowRight->setLayout(vlayout);

    // 2. 创建上方标题栏
    QWidget* titleWidget = new QWidget();
    titleWidget->setFixedHeight(62);
    // 第一个参数是水平策略 可延伸，第二个是垂直策略 固定，不可颠倒
    titleWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    titleWidget->setObjectName("titleWidget");
    titleWidget->setStyleSheet("#titleWidget {border-bottom:1px solid rgb(200,200,200); border-left: 1px solid rgb(200,200,200) ;}");
    // 加入到布局管理器中
    vlayout->addWidget(titleWidget);

    // 3.给标题栏 添加 标题label 和一个按钮
    QHBoxLayout* hlayout = new QHBoxLayout();
    hlayout->setSpacing(0);
    // 使标题的label和按钮距离左右两侧的边界,有点距离
    hlayout->setContentsMargins(10,0,10,0);
    titleWidget->setLayout(hlayout);

    QLabel* sessionTitleLabel = new QLabel();


#if TEST_UI
    sessionTitleLabel->setStyleSheet("QLabel {font-size: 22px; border-bottom:1px solid rgb(200,200,200); } ");
    // 为了测试界面临时增加的，实际这里的内容，应该是使用服务器获取的数据来设置
    sessionTitleLabel->setText("这是会话标题");
#endif

    hlayout->addWidget(sessionTitleLabel);

    QPushButton* extraBtn = new QPushButton();
    extraBtn->setFixedSize(30,30);
    extraBtn->setIconSize(QSize(30,30));
    extraBtn->setIcon(QIcon(":/resource/image/more.png"));
    extraBtn->setStyleSheet("QPushButton {border:none; background-color : rgb(245,245,245);} QPushButton:pressed {background-color:rgb(220,220,220);}");
    hlayout->addWidget(extraBtn);

    // 4.添加消息展示区
    messageShowArea = new MessageShowArea();
    vlayout->addWidget(messageShowArea);

    // 5.消息编辑区
    messageEditArea = new MessageEditArea();
    // 0:拉伸系数
    // 确保消息编辑区，处于窗口的下方
    vlayout->addWidget(messageEditArea,0,Qt::AlignBottom);



}

void MainWidget:: InitMidWindow()
{
    // 中间栏中既有水平又有垂直部分的，所以使用网格布局进行管理
    QGridLayout* layout = new QGridLayout();
    // 距离上方有 20px，另外3个方向都不要边距
    layout->setContentsMargins(0,20,0,0);
    // 元素之间距离
    // layout->setSpacing(0);
    layout->setHorizontalSpacing(0);
    layout->setVerticalSpacing(10);
    windowMid->setLayout(layout);

    searchEdit = new QLineEdit();
    // 设置搜索框的高度
    searchEdit->setFixedHeight(30);
    // 搜索框内默认显示的文字（搜索）
    searchEdit->setPlaceholderText("搜索");
    // 设置样式
    searchEdit->setStyleSheet("QLineEdit {border-radius: 6px ; background-color:rgb(210,210,210);}");

    addFriendBtn = new QPushButton();
    // 设置样式
    addFriendBtn->setFixedSize(30,30);
    // 设置图标
    addFriendBtn->setIcon(QIcon(":/resource/image/cross.png"));
    QString style = "QPushButton { border-radius: 6px; background-color:rgb(226,226,226);}} ";
    // 伪类选择器
    style +=  "QPushButton:pressed{background-color:rgb(240,240,240)}";
    addFriendBtn->setStyleSheet(style);

    // 创建一个好友区域的类 --> 新增文件 C++类进行创建
    SessionFriendArea* sessionFriendArea = new SessionFriendArea();

    // 为了更灵活的控制边距，只能影响搜索框按钮这一行，不影响下方列表这一行
    // 创建空白的widget，填充到布局管理器中
    QWidget* space1 = new QWidget();
    space1->setFixedWidth(10);
    QWidget* space2 = new QWidget();

    space2->setFixedWidth(10);
    QWidget* space3 = new QWidget();
    space3->setFixedWidth(10);
    layout->addWidget(space1,0,0);
    layout->addWidget(searchEdit,0,1);
    layout->addWidget(space2,0,2);
    layout->addWidget(addFriendBtn,0,3);
    layout->addWidget(space3,0,4);


    // layout->addWidget(sessionFriendArea,1,0);
    // 上面这个写法，把中间栏分成了5列，好友列表只占1列，修改如下
    // 第1行，第0列，横跨1行，横跨5列
    layout->addWidget(sessionFriendArea,1,0,1,5);

}



MainWidget::~MainWidget() {}

MainWidget* MainWidget::instance = nullptr;

MainWidget* MainWidget::getInstance()
{
    if(instance == nullptr)
    {
        // 此处不传入参数，以桌面为父窗口
        // 此处窗口是整个程序的主窗口，父窗口设定为桌面，本身是何理的设定
        // 其他时刻需要考虑
        // 主窗口会在程序启动，登录完成时创建实例（创建时期不会有多个线程）
        // 后续再使用单例时，窗口一定已经创建完了，也就没有线程安全了
        instance = new MainWidget();
    }
    return instance;
}
